package com.csu.common.wx;

import java.util.HashMap;
import java.util.Map;

import org.apache.log4j.Logger;

import com.csu.common.constants.CommonParams;
import com.csu.common.constants.SystemCode;
import com.csu.common.exception.WebException;
import com.csu.common.utils.HttpUtil;
import com.csu.common.utils.JsonUtil;
import com.csu.common.utils.RedisUtil;
import com.csu.common.vo.WxAccessTokenVo;

/**
 * @项目名称：cphone
 * @类名称：WxAuthorizeHelper
 * @类描述：
 * @创建人：Tangc
 * @创建时间：2017年10月12日 下午7:04:28
 * @company:
 */
public class WxAuthorizeHelper
{
    private static final Logger logger = Logger.getLogger(WxAuthorizeHelper.class);
    // public static final String Access_Token = "accessToken:";
    private static final String Refresh_Token = "refreshToken:";

    /**
     * @description
     * @author TangC
     * @date 2017年10月26日 上午11:03:52
     * @param code
     * @return
     */
    public static WxAccessTokenVo getAccessToken(String code) throws WebException
    {
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("code", code);
        params.put("appid", CommonParams.WX_APP_ID);
        params.put("secret", CommonParams.WX_APP_SECRET);
        params.put("grant_type", "authorization_code");

        String json = HttpUtil.getMap(CommonParams.WX_AUTH_TOKEN_URL, params);

        if (json.contains("\"errcode\":40029"))
        {
            logger.error("获取微信access-token失败,code:" + code);
            throw new WebException(SystemCode.WX_Access_Token_ERROR, "获取微信access-token失败");
        }

        WxAccessTokenVo accessToken = JsonUtil.toObject(json, WxAccessTokenVo.class);
        // RedisUtil.getRedisDb().setex(Access_Token + accessToken.getOpenid(),
        // 7200, accessToken.getAccess_token());
        RedisUtil.getRedisDb().set(Refresh_Token + accessToken.getOpenid(), accessToken.getRefresh_token());
        return accessToken;
    }

    /**
     * @description
     * @author TangC
     * @date 2017年10月26日 上午11:20:38
     * @param refreshToken
     * @return
     * @throws WebException
     */
    public static WxAccessTokenVo refreshAccessToken(String openid) throws WebException
    {
        String refreshToken = RedisUtil.getRedisDb().get(Refresh_Token + openid);

        Map<String, Object> params = new HashMap<String, Object>();
        params.put("appid", CommonParams.WX_APP_ID);

        params.put("refresh_token", refreshToken);
        params.put("grant_type", "refresh_token");

        String json = HttpUtil.getMap(CommonParams.WX_REFRESH_TOKEN_URL, params);

        if (json.contains("\"errcode\":40029"))
        {
            logger.error("刷新微信refreshToken失败,refreshToken:" + refreshToken);
            throw new WebException(SystemCode.WX_Refresh_Token_ERROR, "刷新微信refreshToken失败");
        }

        WxAccessTokenVo accessToken = JsonUtil.toObject(json, WxAccessTokenVo.class);
        // RedisUtil.getRedisDb().setex(Access_Token + accessToken.getOpenid(),
        // 7000, accessToken.getAccess_token());
        // RedisUtil.getRedisDb().set(Refresh_Token + accessToken.getOpenid(),
        // accessToken.getRefresh_token());
        return accessToken;
    }

}
